'use strict';

require('../../support/test-helper');

var assert = require('../../support/assert');
var TestClient = require('../../support/test-client');

describe('analysis-layers regressions', function () {
    it('should return a complete list of nodes from analysis', function (done) {
        var mapConfig = {
            version: '1.5.0',
            layers: [
                {
                    type: 'cartodb',
                    options: {
                        cartocss: TestClient.CARTOCSS.POINTS,
                        cartocss_version: '2.1.1',
                        interactivity: [],
                        source: {
                            id: 'a4'
                        }
                    }
                },
                {
                    type: 'cartodb',
                    options: {
                        cartocss: TestClient.CARTOCSS.POINTS,
                        cartocss_version: '2.1.0',
                        interactivity: [],
                        source: {
                            id: 'b1'
                        }
                    }
                }
            ],
            dataviews: {
                '74493a30-4679-4b72-a60c-b6f808b57c98': {
                    type: 'histogram',
                    source: {
                        id: 'b0'
                    },
                    options: {
                        column: 'customer_value',
                        bins: 10
                    }
                }
            },
            analyses: [
                {
                    id: 'a4',
                    type: 'point-in-polygon',
                    params: {
                        polygons_source: {
                            id: 'a3',
                            type: 'buffer',
                            params: {
                                source: {
                                    id: 'a2',
                                    type: 'centroid',
                                    params: {
                                        source: {
                                            id: 'b1',
                                            type: 'kmeans',
                                            params: {
                                                source: {
                                                    id: 'b0',
                                                    type: 'source',
                                                    params: {
                                                        query: 'SELECT * FROM populated_places_simple_reduced'
                                                    }
                                                },
                                                clusters: 5
                                            }
                                        },
                                        category_column: 'cluster_no'
                                    }
                                },
                                radius: 200000
                            }
                        },
                        points_source: {
                            id: 'customer_home_locations',
                            type: 'source',
                            params: {
                                query: 'SELECT * FROM populated_places_simple_reduced'
                            }
                        }
                    }
                }
            ]
        };

        var testClient = new TestClient(mapConfig, 1234);

        testClient.getLayergroup(function (err, layergroupResult) {
            assert.ok(!err, err);

            assert.ok(layergroupResult);
            assert.ok(layergroupResult.metadata);
            var analyses = layergroupResult.metadata.analyses;
            assert.ok(analyses);
            assert.strictEqual(analyses.length, 1);

            var expectedIds = ['customer_home_locations', 'b0', 'b1', 'a2', 'a3', 'a4'];
            expectedIds.forEach(function (expectedId) {
                assert.ok(
                    Object.prototype.hasOwnProperty.call(analyses[0].nodes, expectedId),
                    'Missing "' + expectedId + '" from node list.'
                );
            });
            assert.strictEqual(Object.keys(analyses[0].nodes).length, expectedIds.length, Object.keys(analyses[0].nodes));

            testClient.drain(done);
        });
    });
});
